package tech.aistar.day11;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 本类用来演示: Lock实现方式
 *
 * @author: success
 * @date: 2022/8/2 9:46 上午
 */
public class LockDemo {
    //默认的不公平锁
    //如果ReentrantLock(true) - 公平锁
    private Lock lock = new ReentrantLock();

    public void add(){
        //显式锁 - 手动上锁和手动释放锁
        //只能锁住代码块 - 对象锁 - 不同的对象拥有不同的锁
        //synchronized还是lock => 独占锁,悲观锁(某个线程在操作数据的时候,总会觉得别的线程也会操作这个数据,因此在操作数据之前,需要先锁住)
        //lock出现了异常,不会自动释放锁的
        try {
            lock.lock(); // 手动申请锁
            //同步代码 - 一次只能由线程进入
            System.out.println(Thread.currentThread().getName()+":enter~");

            TimeUnit.SECONDS.sleep(1);

            System.out.println(Thread.currentThread().getName()+":level~");
        } catch (Exception e) {
            e.printStackTrace();
        }finally { // 无论是否出现异常,都会执行
            lock.unlock();//手动释放锁
        }
    }
}
class LockDemoTest{
    public static void main(String[] args) {
        LockDemo demo = new LockDemo();
        new Thread(()->demo.add()).start();
        new Thread(()->demo.add()).start();
    }
}
